function CSlSectionsBuilder ( sSelector, aSections ) {
	
	var oContainer = $( sSelector );
	
	/**
	 * Очистка
	 */
	this.clear = function() {
		oContainer.empty();
	}
	
	/**
	 * Построение списка разделов
	 */
	this.build = function( _aSections ) {
		
		this.clear();
		
		var iCatCount = _aSections.length;
		var iCatCountInFirstColumn = Math.ceil( iCatCount / 2 );

		var oColumn = $("<div class='b-col_left'></div>").appendTo( oContainer );
		
		for ( var i = 0; i < _aSections.length; i++ ) {
			var oSection = $("<div class='b-software_category'></div>")
						.append("<h3 class='h3 red'>"+_aSections[i].sName+"</h3>")
						.appendTo( oColumn )
			
			var oSubSectionsElement = $("<div id='cat"+_aSections[i].iId+"' class='b-category'></div>");
			var aSubSections =  _aSections[i].aSubSections;
			for ( var j = 0; j < aSubSections.length; j++ ) {
				//oSubSections 
				var oSubSection = $("<span class='cat-item'></span>")
										.append("<a href='/software/category/"+aSubSections[j].iId+"/' class='green'>"+aSubSections[j].sName+"</a>&nbsp;("+aSubSections[j].iCount+")")
				if ( j < aSubSections.length - 1  ) {
					oSubSection.append("<span class='comma'>, </span>");
				}						
				oSubSection.appendTo( oSubSectionsElement );
			}
			oSubSectionsElement.appendTo( oSection );
			
			if ( i == iCatCountInFirstColumn - 1 ) {
				oColumn = $("<div class='b-col_right'></div>").appendTo( oContainer );
			}
		}
		
	}
	
	this.deepObjCopy = function (dupeObj) {
		var retObj = new Object();
		if (typeof(dupeObj) == 'object') {
			if (typeof(dupeObj.length) != 'undefined')
				var retObj = new Array();
			for (var objInd in dupeObj) {	
				if (typeof(dupeObj[objInd]) == 'object') {
					retObj[objInd] = this.deepObjCopy(dupeObj[objInd]);
				} else if (typeof(dupeObj[objInd]) == 'string') {
					retObj[objInd] = dupeObj[objInd];
				} else if (typeof(dupeObj[objInd]) == 'number') {
					retObj[objInd] = dupeObj[objInd];
				} else if (typeof(dupeObj[objInd]) == 'boolean') {
					((dupeObj[objInd] == true) ? retObj[objInd] = true : retObj[objInd] = false);
				}
			}
		}
		return retObj;
	}
		
	/**
	 * Фильтрация 
	 */
	this.filter = function( sFilter ) {
		var oCheckVal = new RegExp("[^А-ЯA-Z0-9_ \-]*", "ig");
		sFilter = sFilter.replace(oCheckVal,"");
		sFilter = $.trim( sFilter );
		var oFilter = new RegExp( sFilter, 'i' );
		
		var aResult = new Array();
		
		if( sFilter.length > 1 ) {
			for( var i = 0; i < aSections.length; i++ ) {
				var aSubSections = aSections[i].aSubSections;
				var aFoundedSubSections = new Array();
				
				for ( var j = 0; j < aSubSections.length; j++ ) {
					if ( oFilter.test(aSubSections[j].sName) ) {
						aFoundedSubSections[aFoundedSubSections.length] = aSubSections[j];
					}
				}
				
				if ( aFoundedSubSections.length > 0 ) {
					// тут один умник использовал не глубокое, а простое копирование.
					// в итоге, исходный массив aSections затирался и его уже было не вернуть
					var aSection = this.deepObjCopy(aSections[i]);
					aSection.aSubSections = aFoundedSubSections;
					aResult[aResult.length] = aSection;
				}
			}
		} else {
			aResult = aSections;
		}
				
		if( aResult.length > 0 ){
			this.build( aResult );
			return true;
		}else{
			return false;
		}
	}
	
	this.build( aSections );
}

//скрытие/отображение иконки загрузки
function showLoadIcon( oElement, bFlag ) {
	
	if ( bFlag ) {
		oElement.addClass("ajax-load");
	} else {
		oElement.removeClass("ajax-load");
	}
}
